import sys
import os
import json
from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QFileDialog,
                             QLineEdit, QInputDialog,QGroupBox, QMessageBox,QProgressBar,QWidget,QApplication, QWidget, QVBoxLayout, QPushButton, QFileDialog, QLabel, QMessageBox,QGridLayout)
import subprocess
from O_SOP_orginput import OrgInfoApp
from O_SOP_LawWindow import LawWindow


# 或者其他合适的基类，比如 QMainWindow
class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.status_label = None
        self.config = ConfigManager()  # 初始化ConfigManager
        self.initUI()

    def initUI(self):
        self.setWindowTitle('制度程序化工具')
        self.setGeometry(300, 300, 600, 500)

        # 创建一个 QWidget 作为中央部件
        central_widget = QWidget(self)
        self.setCentralWidget(central_widget)

        # 为中央部件设置布局
        layout = QGridLayout(central_widget)

        # 数据录入路径设置
        input_group = QGroupBox("制度文件夹选择")
        input_layout = QVBoxLayout()
        input_label = QLabel('制度文件路径:')
        self.input_path_line_edit = QLineEdit(self.config.get('input_folder'))
        input_button = QPushButton('选择路径')
        input_button.clicked.connect(lambda: self.select_folder('input_folder'))
        input_hbox = QHBoxLayout()
        input_hbox.addWidget(input_label)
        input_hbox.addWidget(self.input_path_line_edit)
        input_hbox.addWidget(input_button)
        input_layout.addLayout(input_hbox)
        input_group.setLayout(input_layout)

        # 报表输出路径设置
        output_group = QGroupBox("表单输出")
        output_layout = QVBoxLayout()
        output_label = QLabel('表单输出路径:')
        self.output_path_line_edit = QLineEdit(self.config.get('output_folder'))
        output_button = QPushButton('选择路径')
        output_button.clicked.connect(lambda: self.select_folder('output_folder'))
        output_hbox = QHBoxLayout()
        output_hbox.addWidget(output_label)
        output_hbox.addWidget(self.output_path_line_edit)
        output_hbox.addWidget(output_button)
        output_layout.addLayout(output_hbox)
        output_group.setLayout(output_layout)

        # 添加其他按钮
        leave_button = QPushButton('公司与级别编辑')
        leave_button.clicked.connect(self.leave_situation)  # 假设你有一个名为 leave_situation 的槽函数

        weekly_report_button = QPushButton('制度文件查询')
        weekly_report_button.clicked.connect(self.weekly_report)

        buttons_layout = QHBoxLayout()
        tax_button = QPushButton('工作票')
        tax_button.clicked.connect(self.import_tax_table)

        attendance_button = QPushButton('制度文件更新')
        attendance_button.clicked.connect(self.generate_attendance)


        #布局设定

        buttons_layout.addWidget(weekly_report_button)
        buttons_layout.addWidget(tax_button)
        buttons_layout.addWidget(leave_button)
        buttons_layout.addWidget(attendance_button)


        # 状态标签（不需要进度条，所以这里直接添加输出按钮布局）
        self.status_label = QLabel('注意：请严格按照指南配置制度文件')
        self.progressBar = QProgressBar(self)

        # 将所有布局添加到主布局中
        layout.addWidget(input_group, 0, 0, 1, 2)  # 跨两列
        layout.addWidget(output_group, 1, 0, 1, 2)
        layout.addLayout(buttons_layout, 2, 0, 1, 2)
        layout.addWidget(self.progressBar, 4, 0, 1, 2)  # 将输出按钮放在之前进度条的位置
        layout.addWidget(self.status_label, 5, 0, 1, 2)  # 状态标签放在最下面

    def select_folder(self, folder_type):
        path = QFileDialog.getExistingDirectory(self, '选择文件夹')
        if path:
            # 确保路径字符串以路径分隔符结尾
            if not path.endswith(os.path.sep):
                path += os.path.sep

                # 根据folder_type更新界面和配置
            if folder_type == 'input_folder':
                self.input_path_line_edit.setText(path)
                self.config.set('input_folder', path)
            elif folder_type == 'output_folder':
                self.output_path_line_edit.setText(path)
                self.config.set('output_folder', path)
            else:
                # 如果folder_type不是预期的值，可以抛出一个异常或进行其他错误处理
                raise ValueError(f"Invalid folder_type: {folder_type}")

    #第一按钮
    def leave_situation(self):
        # 这里添加处理员工请假情况的逻辑
        self.OrgInfoApp = OrgInfoApp()  #创建 JsonEditor 实例
        self.OrgInfoApp.show()  # 显示窗口

    #第二按钮
    def weekly_report(self):
        self.LawWindow = LawWindow()  #创建 JsonEditor 实例
        self.LawWindow.show()  # 显示窗口

    #第三按钮
    def import_tax_table(self):
        self.TAXToJsonApp = TAXToJsonApp()  # 正确命名实例
        self.TAXToJsonApp.show()  # 正确引用实例

    #第四按钮
    def generate_attendance(self):
        self.ASUToJsonApp = ASUToJsonApp()  # 创建 JsonEditor 实例
        self.ASUToJsonApp.show()  # 显示窗口
        self.updateStatus("")

    #第五按钮
    def feature_setting(self):
        self.ExcelToJsonApp = ExcelToJsonApp()  # 创建 JsonEditor 实例
        self.ExcelToJsonApp.show()  # 显示窗口

    #主按钮第一按钮
    def daily_report(self):
        self.updateStatus("")

        scripts_with_args = [

        ]
        total_scripts = len(scripts_with_args)
        self.progressBar.setMaximum(total_scripts)

        for index, (module, args) in enumerate(scripts_with_args):
            try:
                # 使用 *args 来解包参数列表
                output = module.main(*args)  # 假设每个模块都有一个main函数
                # 这里可以处理output，例如打印或记录到文件
                self.updateProgressBar(index + 1)
                self.updateStatus(f"正在执行 {module.__name__}...")
            except Exception as e:
                # 更新进度条和状态信息，显示错误信息
                self.updateProgressBar(index + 1)  # 仍然更新进度条，即使出错
                self.updateStatus(f"执行 {module.__name__} 时出错: {str(e)}")
                QMessageBox.critical(self, "错误", f"执行 {module.__name__} 时出错: {str(e)}")

                # 所有脚本执行完毕后，更新状态和进度条
        self.updateProgressBar(0)

        self.updateStatus("完成啦")
        QMessageBox.information(self, "提示", "工资单已生成")

    #主按钮第二按钮
    def generate_attendance_report(self):
        # 这里应该添加生成考勤表报告的逻辑
        self.updateStatus("考勤表输出中...")
        # 假设这里是模拟处理过程
        QMessageBox.information(self, "提示", "考勤表已生成")
        self.updateStatus("考勤表输出完成")

    # 效果控件
    def updateStatus(self, message):
        self.status_label.setText(message)
        # 更新状态标签
        self.updateStatus("")

    def updateProgressBar(self, value):
        self.progressBar.setValue(value)


class ConfigManager:
    default_config = {
        'input_folder': '',
        'output_folder': '',
        'workedatas': 'Workdatas'
    }

    def __init__(self, config_path='config.json'):
        self.config_path = config_path
        self.config = self.load_config()

    def load_config(self):
        if not os.path.exists(self.config_path):
            # 如果文件不存在，则创建并填充默认配置
            self.save_config(self.default_config)
            return self.default_config

        with open(self.config_path, 'r', encoding='utf-8') as file:
            content = file.read()
            if not content:  # 检查文件是否为空
                self.save_config(self.default_config)
                return self.default_config

            try:
                config = json.loads(content)  # 使用 json.loads() 而不是 json.load()
            except json.JSONDecodeError as e:
                print(f"Error decoding JSON: {e}")
                self.save_config(self.default_config)
                return self.default_config
        return config

    def save_config(self, config):
        with open(self.config_path, 'w', encoding='utf-8') as file:
            json.dump(config, file, ensure_ascii=False, indent=4)
        self.config = config

    def get(self, key, default=None):
        return self.config.get(key, default)

    def set(self, key, value):
        self.config[key] = value
        self.save_config(self.config)


def main():
    app = QApplication(sys.argv)
    ex = MyApp()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()